home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / lollipop / lollipop.hqx / Lollipop v0.93 / lists.tex < prev    next >
Text File  |  1992-11-10  |  10KB  |  337 lines

  1. % Lists.tex copyright 1992 Victor Eijkhout
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%%%%%%%% L I S T S 
  4.  
  5.  
  6. \@GenericConstruct{List}
  7.  
  8. \newif\if@initem \@initemyes \newif\if@alitem
  9. \newbox\@labelbox 
  10.  
  11. \def\item{\Emessage{Item command outside list}}
  12.  
  13. % Breakpoints around a list
  14. %
  15. % first redefine generic defaults:
  16. % try not to break before, maybe not after,
  17. %
  18. \add@List@default{\def\@beforepenalty{\penalty1000 }}
  19. \add@List@default{\def\@afterpenalty{\penalty200 }}
  20.  
  21. % between items is okay
  22. \add@List@default{\def\@betweenpenalty{\penalty-50 }}
  23. \@ListOption{breakbetween}{
  24.     \switch {\if\EqualString{#1}}
  25.     {no}  {\def\@betweenpenalty{\penalty\@M}}
  26.     {yes} {\def\@betweenpenalty{\CSname{\h@or@v fil}\penalty-\@M}}
  27.     {0}   {\def\@betweenpenalty{}}
  28.     {default} {\edef\cs@e{\def\nxp\@betweenpenalty{\penalty\@w@w{#1}\relax}}
  29.                \cs@e}
  30.     \endswitch
  31.     }
  32.  
  33. %% anonieme namen in gebruik
  34. % \temptokse : inspringdiepte
  35.  
  36. \add@List@default{\temptokse={}}
  37.  
  38. \noeol
  39. \def\@DefineList{
  40.     \@DefineStopCommand{\nxp\xx@label \the\item@e@coms\@gen@close}
  41.     \csarg\edef{\@name}{\@gen@open
  42.          \ifitem@list \nxp\step@counter{itemlevel}\fi
  43.          \ifenum@list \nxp\step@counter{enumlevel}
  44.             \nxp\represent@counter{item}
  45.                 {\nxp\enum@repr{\counter@@name{enumlevel}}}\fi
  46.          \ifleft@embedded@construct \previousindent\z@
  47.              \else \nxp\PushIndentLevel 
  48.                    \ifauto@indent \else \levelindent\the\temptokse \fi
  49.                    \parindent\levelindent
  50.              \fi
  51.          \nxp\@alitemno
  52.          \nxp\start@counter{item}%
  53.          \the\item@b@coms
  54.          \def\nxp\item@label{
  55.              \nxp\ifdim\wd\@labelbox>\tempdima
  56.                  \ifitem@tab \advance\tempdima20pt\relax
  57.                              {\nxp\item@label}
  58.                  \else \iflabel@flow@right 
  59.                              \ifleft@embedded@construct
  60.                              \else\hskip-\previousindent\fi
  61.                              \box\@labelbox
  62.                        \else \nxp\llap{\box\@labelbox}\fi\fi
  63.              \nxp\else \llap{\hbox to \tempdima
  64.                 {\ifleft@item\else\hfil\fi
  65.                  \box\@labelbox \ifleft@item\hfil\fi}}
  66.              \nxp\fi}%
  67.          \def\nxp\num@item
  68.             {\setbox\@labelbox=\hbox{\the\item@coms}
  69.              \tempdima\previousindent
  70.              \nxp\item@label %\nxp\Indent:no
  71.              \the\item@a@coms \nxp\xx@label}
  72.          \def\nxp\item
  73.             {\ifleft@embedded@construct
  74.              \else \nxp\if@alitem\@par%\CSname{@itembreek}%
  75.                    \nxp\hold@parskip \nxp\fi \fi
  76.              \nxp\if\nxp\TestCounter:item >0 \@betweenpenalty \nxp\fi
  77.              \CSname{@\h@or@v white}{\white@between}
  78.              \nxp\@initemno \nxp\@alitemyes \nxp\noindent
  79.              \nxp\step@counter{item}\relax 
  80.              \iflabel@defined\else\nxp\define@reference{item}\fi
  81.              \CSname{\@name @item}}
  82.          }
  83.     \csarg\edef{\@name @item}{
  84.          \iflist@has@description \nxp\desc@item
  85.          \else \nxp\num@item\fi}
  86.     \@Labelize{\@name @item}
  87.     }
  88. \normaleol
  89.  
  90. % Inside a list Foo \item is defined as
  91. %
  92. % \item = all sorts of skips and switches
  93. %         step item counter, define reference
  94. %         \Foo@item
  95. %
  96. % \Foo@item[opt.lab.] = \desc@item or \num@item
  97. %
  98. % \desc@item =
  99. % { \aftergroup\num@item \@description}
  100. %
  101. % \num@item = \item@label \item@a@coms \xx@label
  102. %
  103.  
  104. % Item
  105. % start with start/left/right
  106. % indicating alignment, start = left
  107. %
  108. \newif\ifleft@item \newif\ifitem@tab
  109. \add@List@default{\left@itemyes \item@tabno}
  110. \newtoks\item@coms % content of the item label
  111. \newtoks\item@b@coms % start of the list?
  112. \newtoks\item@a@coms % immediately after the item
  113. \newtoks\item@e@coms % after the whole list
  114. \add@List@default{\item@coms{}\item@b@coms{}\item@a@coms{}
  115.     \item@e@coms{}\def\@current@options@list{item@b@coms}}
  116. \@ListOption{item}{
  117.     \switch {\if\EqualString{#1}}
  118.     {stop} {\@add@toks{\egroup}\e@group
  119.          \def\@current@options@list{item@a@coms}}
  120.     {tabstop} {\item@tabyes
  121.              \@add@toks{\egroup}\e@group
  122.              \def\@current@options@list{item@a@coms}}
  123.     {left} {\global\left@itemyes
  124.              \b@group\def\@current@options@list{item@coms}%
  125.              \@add@toks{\bgroup}}
  126.     {start}{\global\left@itemyes
  127.              \b@group\def\@current@options@list{item@coms}%
  128.              \@add@toks{\bgroup}}
  129.     {right}{\global\left@itemno
  130.              \b@group\def\@current@options@list{item@coms}%
  131.              \@add@toks{\bgroup}}
  132.     {default} {\Emessage{Unknown option #1 for List, item}}
  133.     \endswitch}
  134.  
  135. % Label overflow
  136. %
  137. \newif\iflabel@flow@right
  138. \add@List@default{\label@flow@rightyes}
  139. \@ListOption{labeloverflow}{
  140.     \if\EqualString{#1}{left}\label@flow@rightno
  141.     \else\label@flow@rightyes\fi}
  142.  
  143. % Description
  144. % the line after \item gets picked up,
  145. % and becomes available as `description'
  146. %
  147. \newif\iflist@has@description
  148. \add@List@default{\list@has@descriptionno}
  149. \@ListOption{description}{
  150.     \global\list@has@descriptionyes \@add@toks{\description@text}}
  151. {\noeol
  152.  \othercr
  153. \gdef\@description{\bgroup\othercr \@@description}
  154. \gdef\@@description#1^^M
  155.     {\gdef\description@text{#1}%
  156.     \egroup % balance the \bgroup in \@description
  157.             % which kept the \othercr local
  158.     \egroup % balance the \bgroup in \desc@item
  159.             % which enabled the \aftergroup\num@item
  160.     }
  161. }
  162. \def\desc@item{\bgroup    
  163.     \aftergroup\num@item
  164.     \@description}
  165.  
  166. % White between items
  167. %
  168. \add@List@default{\def\white@between{0pt}}
  169. \@ListOption{whitebetween}{\def\white@between{#1}}
  170. %    \edef\white@between{\@w@w{#1}}}
  171.  
  172. % Indentation
  173. % is automatic (default) and level dependent
  174. % or explicit
  175. %
  176. \newif\ifauto@indent
  177. \add@List@default{\auto@indentyes}
  178. \@ListOption{indentation}{
  179.     \if\EqualString{#1}{automatic}\auto@indentyes
  180.     \else\auto@indentno
  181.          \edef\cs@e{\nxp\temptokse={\@w@w{#1}}}\cs@e
  182.     \fi}
  183.  
  184. % Tail of the list:
  185. % everything after the keyword 'text' is tail
  186. %
  187. \@ListOption{text}{\at@breakpointyes
  188.     \def\@current@options@list{item@e@coms}}
  189.  
  190. %%%%%%%%%%%%%%%% List Nesting Counters
  191. %
  192.  
  193. % Item sign
  194. % gives the default, level dependent marker
  195. %
  196. \new@@counter{itemlevel} \set@counter{itemlevel}\z@
  197. \newif\ifitem@list
  198. \add@List@default{\item@listno}
  199. \@ListOption{itemsign}{
  200.     \global\item@listyes
  201.     \edef\cs@e{\nxp\@add@toks{\nxp\item@sign\counter@@name{itemlevel}}}
  202.     \cs@e}
  203. \def\@item@sign#1{itemsign\romannumeral#1}
  204. \def\item@sign#1{\ifnotdefined{\@item@sign{#1}}\@@item@sign{#1}%
  205.     \else \csname \@item@sign{#1}\endcsname \fi}
  206. \def\@@item@sign#1{\ifcase#1\relax\or
  207.     $\bullet$\or $\circ$ \or --\else $\cdot$\fi}
  208. \def\SetItemSign:#1=#2{\csarg\edef{\@item@sign{#1}}%
  209.    {\cswitch \ifx#2 in:
  210.     b $\bullet$;
  211.     c $\circ$;
  212.     d $\diamond$;
  213.     m ---;
  214.     n --;
  215.     . $\cdot$;
  216.     default $\cdot$;
  217.     \endswitch}}
  218.  
  219. % Item Counter 
  220. % Allocate a bare bones counter
  221. \new@@counter{item}\represent@counter{item}1
  222. \newtoks\item@RL \item@RL{}
  223.  
  224. % Keep track of enumerate list level
  225. %
  226. \new@@counter{enumlevel} \set@counter{enumlevel}\z@
  227. \newif\ifenum@list
  228. \add@List@default{\enum@listno}
  229. \@ListOption{itemCounter}{
  230.     \global\enum@listyes
  231.     \@add@toks{\pad@clear\itemCounter}
  232.     }
  233. \def\@enum@repr#1{enumrepr\romannumeral#1}
  234. \def\enum@repr#1{\ifnotdefined{\@enum@repr{#1}}\@@enum@repr{#1}%
  235.     \else \csname \@enum@repr{#1}\endcsname \fi}
  236. \def\@@enum@repr#1{\ifcase#1\relax\or
  237.     1\or A\or I\or a\or i\else 1\fi}
  238. \def\SetItemCounterRepresentation:#1=#2{\csarg\edef{\@enum@repr{#1}}{#2}}
  239.  
  240. %
  241. \def\@itembreek{\if@initem\par\fi}
  242.  
  243. % Clear items for Widest.
  244. % this is rather susceptible for improvement.
  245. %
  246. \def\ClearFor:#1 
  247.    {\def\widest@pad{#1}}
  248. \def\widest@pad{\m@ne}
  249. \def\pad@clear{\ifnum\widest@pad=\m@ne\else
  250.     \tempcounta\widest@pad
  251.     \advance\tempcounta-\LogTen{\cs@counter@name{item}}\relax
  252.     \hphantom{\ifcase\tempcounta \or 9\or 99 \or 999 \or 9999 \else 99999\fi
  253.               }%
  254.     \fi}
  255.  
  256. %%%%%%%%%%%%%%%% Stripped Lists
  257. %
  258. % for use in external files
  259. %
  260.  
  261. \@GenericConstruct{ExternalItem}%stripped list
  262.  
  263. \add@ExternalItem@default{\extra@args\tw@}
  264.  
  265. \noeol
  266. \def\@DefineExternalItem{
  267.     \@DefineStopCommand{\@gen@close}
  268.     \ifx\pre@fix\@empty \Wmessage{No file for external item: \@name}\fi
  269.     \edef\cs@e{\nxp\append@to@list
  270.          {\pre@fix @local@defs}
  271.          {\nxp\ifnotdefined{\@command}
  272.                    \nxp\Wmessage{Item `\@name' not defined for `\pre@fix'}
  273.           \nxp\else\let\CSname{\@name}\CSname{\@command}
  274.           \nxp\fi}}
  275.     \cs@e
  276.     \csarg\edef{\@command}##1##2{
  277.          \def\CSname{\@name Label}{##1}
  278.          \@gen@open\def\nxp\Page{##2}
  279.          \nxp\PushIndentLevel \let\nxp\nl\relax
  280.          \the\item@b@coms
  281.          \def\nxp\item{\ifleft@embedded@construct\else\noindent\fi
  282.              \setbox\@labelbox=\hbox{\the\item@coms}
  283.              \nxp\ifdim\wd\@labelbox>\previousindent
  284.                  \iflabel@flow@right \hskip-\previousindent\box\@labelbox
  285.                  \else \nxp\llap{\box\@labelbox}\fi
  286.              \nxp\else \llap{\hbox to \previousindent
  287.                 {\ifleft@item\else\hfil\fi
  288.                  \box\@labelbox \ifleft@item\hfil\fi}}
  289.              \nxp\fi}%
  290.          \nxp\item\the\item@a@coms
  291.          \ifright@embedded@construct\else\@par\fi
  292.          \iflong@external\else\nxp\>\fi
  293.          }
  294.     }
  295. \normaleol
  296.  
  297. \add@ExternalItem@default{\@whitebefore\z@toks}
  298. \add@ExternalItem@default{\@whiteafter\z@toks}
  299. \add@ExternalItem@default{\let\Page\@space 
  300.     \csarg\let{\@name Label}\@space}
  301.  
  302. % Specify for what external file this is meant
  303. %
  304. \@ExternalItemOption{file}{\def\pre@fix{#1}}
  305.  
  306. \newif\iflong@external
  307. \add@ExternalItem@default{\long@externalno}
  308. \@ExternalItemOption{long}{
  309.     \csname long@external#1\endcsname}
  310.  
  311. % Commands before and after
  312. % option 'title' is dummy
  313. %
  314. %\@ExternalItemOption{title}{}
  315. % dangerous: better rely on automatic titelization
  316.  
  317. % Item
  318. % start with start/left/right
  319. % indicating alignment, start = left
  320. %
  321. \add@ExternalItem@default{\left@itemyes}
  322. \add@ExternalItem@default{\item@coms{}\item@b@coms{}\item@e@coms{}
  323.     \item@a@coms{}\def\@current@options@list{item@b@coms}}
  324. \let\ExternalItem@item=\List@item
  325.  
  326. % Label overflow
  327. %
  328. \add@ExternalItem@default{\label@flow@rightyes}
  329. \let\ExternalItem@labeloverflow\List@labeloverflow
  330.  
  331. \endinput
  332.  
  333.  
  334.  
  335.